/*
 * Copyright (c) 2012 SUBSECRETARIA DEFENSORIA DEL ESPACIO PUBLICO - SDEP.
 * All Rights Reserved.
 * This software is the confidential and proprietary information of SDEP
 * Developed By CONSTULT-SOFT S.A, Development Team 2012.
 *
 */
package co.gov.medellin.sdep.sisdep.domain;

import java.io.Serializable;
import java.util.List;
import java.util.Map;

import javax.faces.model.DataModel;
import javax.faces.model.ListDataModel;

import co.gov.medellin.sdep.sisdep.common.AppConstants;
import co.gov.medellin.sdep.sisdep.common.OracleHelper;
import co.gov.medellin.sdep.sisdep.domain.gestion.ConceptoInicialController;
import co.gov.medellin.sdep.sisdep.gestion.exception.SolicitudException;
import co.gov.medellin.sdep.sisdep.integration.mapasmedellin.BeanDireccion;
import co.gov.medellin.sdep.sisdep.integration.mapasmedellin.GeoUbicacionClient;
import co.gov.medellin.sdep.sisdep.model.Evento;
import co.gov.medellin.sdep.sisdep.regulacion.exception.EventoException;
import co.gov.medellin.sdep.sisdep.regulacion.exception.EventoRuntimeException;
import co.gov.medellin.sdep.sisdep.regulacion.service.IEventoService;
import co.gov.medellin.sdep.sisdep.regulacion.service.IEventoVistoBuenoService;

/**
 * @author Usuario
 * 
 */
public class EventoController extends SolicitudBaseController implements
		Serializable {

	/**
	 * generated serial version
	 */
	private static final long serialVersionUID = -3285110767384990403L;

	/**
	 * Constructor por defecto, inicializa los elemento basicos del Controlador
	 */
	public EventoController() {
		this.eventoListModel = new ListDataModel();
	}

	/** bean para el manejo del formulario de busqueda Evento */
	private Evento eventoSearch = new Evento();

	/** Objeto contenedor del listado de Evento luego de una consulta. */
	private DataModel eventoListModel;

	/** bean para el manejo del formulario de creacion/edicion. Evento */
	private Evento evento = new Evento();

	/** instancia de servicio eventoService */
	private IEventoService eventoService;

	/** instancia de servicio eventoVistoBuenoService */
	private IEventoVistoBuenoService eventoVistoBuenoService;

	EventoVistoBuenoController eventoVistoBuenoController ;

	ConceptoInicialController conceptoInicialController ;
	
	
	private GeoUbicacionClient geoUbicacionClient;
	
	/** instancia un objeto de direccion local, en caso que el usuario no valide direccion al menos una vez */
	private BeanDireccion direccionLocal = new BeanDireccion();
	// --------------------------------------------------------------------
	// --- metodos para atender acciones init()
	// --------------------------------------------------------------------

	/**
	 * 
	 */
	public void init(Long solicitudId) throws SolicitudException, EventoException {
		cleanSearchValues();
		this.solicitud = getSolicitudService().get(solicitudId.longValue());
		this.evento = getEventoService().getEventoRelatedBy(solicitudId.longValue());
		if(this.evento == null){
			this.evento = new Evento();
			cleanValues();
			this.evento.setIdSolicitud(solicitudId);
		}
	}
	
	/**
	 * 
	 * @return String
	 */
	public String searchEventoByKey() {
		String msg = "";
		try {
			List valores = null;
			valores = getEventoService().loadByRadicado(1, 10,
					this.eventoSearch);
			this.eventoListModel.setWrappedData(valores);
		} catch (Exception e) {
			msg = e.getMessage();
			e.printStackTrace(System.err);
		}
		if (this.eventoListModel.getWrappedData() == null) {
			msg = AppConstants.NO_RECORDS_FOUND;
		} else {
			if (((List) this.eventoListModel.getWrappedData()).isEmpty()) {
				msg = AppConstants.NO_RECORDS_FOUND;
			}
		}
		((MessageModalWindowController) getBean("messageController"))
				.setSuccessMessage(msg, null, null);
		return AppConstants.EVENTO_SEARCH_VIEW;
	}

	/**
	 * 
	 * @return
	 */
	public String create() {
		String msg = AppConstants.DEFAULT_ERROR;
		try {
			if (this.evento.getId().longValue() == 0L) {
				evento.setIdTipoEvento(new Long(evento.getIdTipoEventoStr()));
				getEventoService().insert(this.evento);
				msg = AppConstants.SUCCESS_CREATE;
			}
		} catch (EventoException e) {
			msg = e.getEndUserMessage();
			e.printStackTrace(System.err);
		} catch (EventoRuntimeException e) {
			msg = e.getEndUserMessage();
			e.printStackTrace(System.err);
		}
		((MessageModalWindowController) getBean("messageController"))
				.setSuccessMessage("- Solicitud Evento " + msg, null, null);
		return AppConstants.EVENTO_SEARCH_VIEW;
	}

	/**
	 * 
	 * @return
	 */
	public String update() {
		String msg = AppConstants.DEFAULT_ERROR;
		try {
			if (this.evento.getId().longValue() == 0L) {
				evento.setIdTipoEvento(new Long(evento.getIdTipoEventoStr()));
				getEventoService().insert(this.evento);
				msg = AppConstants.SUCCESS_CREATE;
			}
			if (this.evento.getId().longValue() != 0L) {
				getEventoService().update(this.evento);
				msg = AppConstants.SUCCESS_UPDATE;
			}
		} catch (EventoException e) {
			msg = e.getEndUserMessage();
			e.printStackTrace(System.err);
		} catch (EventoRuntimeException e) {
			msg = e.getEndUserMessage();
			e.printStackTrace(System.err);
		}
		((MessageModalWindowController) getBean("messageController"))
				.setSuccessMessage("- Solicitud Evento " + msg, null, null);
		return this.solicitudDestinoRedirectPage;
	}
	
	public String vistoBuenoEvento() {
		Map params = getExternalContext().getRequestParameterMap();
		String eventoDataIndex = (String) params
				.get("eventoDataIndex");
		this.evento = (Evento) ((List) this.eventoListModel
				.getWrappedData())
				.get(Integer.parseInt(eventoDataIndex));
			
		int operacion = getEventoVistoBuenoController().searchEventoVistoBuenoByIdEvento(evento.getId(),getEventoVistoBuenoController().getEventoVistoBuenoService());		
		if(operacion==0){			
			getEventoVistoBuenoController().createEventoVistoBueno();
			getEventoVistoBuenoController().eventoVistoBueno.setIdEvento(evento.getId());
			return AppConstants.EVENTOVISTOBUENO_CREATE_VIEW;
		}
		else{
			getEventoVistoBuenoController().updateEventoVistoBueno();
			return AppConstants.EVENTOVISTOBUENO_UPDATE_VIEW;
		}

	}

	public String conceptoInicialEvento() {
		Map params = getExternalContext().getRequestParameterMap();
		String eventoDataIndex = (String) params
				.get("eventoDataIndex");
		this.evento = (Evento) ((List) this.eventoListModel
				.getWrappedData())
				.get(Integer.parseInt(eventoDataIndex));
					
		getConceptoInicialController().conceptoInicialSearch.setIdSolicitud(evento.getIdSolicitud());
		//Validar
		//getConceptoInicialController().conceptoInicialSearch.setRadicado(eventoSearch.getRadicado());
		//Validar
		//getConceptoInicialController().searchConceptoInicialByKey(eventoSearch.getRadicado(), getConceptoInicialController().getConceptoInicialService());
		return AppConstants.CONCEPTO_INICIAL_SEARCH_VIEW;
		

	}
	
	public String checkAddress() {
		direccionLocal = getGeoUbicacionClient().getAddressLocalization(this.evento.getDireccion());
		if(null == direccionLocal) {
			direccionLocal = new BeanDireccion();
		}
		evento.setCodigoBarrio(OracleHelper.isNullorEmpty(direccionLocal.getCodBarrio()) ? "N/A" : direccionLocal.getCodBarrio());
		evento.setBarrio(OracleHelper.isNullorEmpty(direccionLocal.getValueNomBarrio()) ? "NO Disponible" : direccionLocal.getValueNomBarrio());
		evento.setCodigoComuna(OracleHelper.isNullorEmpty(direccionLocal.getCodComuna()) ? "N/A" : direccionLocal.getCodComuna());
		evento.setComuna(OracleHelper.isNullorEmpty(direccionLocal.getValueNomComuna()) ? "NO Disponible" : direccionLocal.getValueNomComuna());

		return "";
	}	

	// --------------------------------------------------------------------
	// --- metodos para atender acciones end()
	// --------------------------------------------------------------------

	// --------------------------------------------------------------------
	// --- metodos para atender reglas de navegacion init()
	// --------------------------------------------------------------------

	/**
	 * 
	 */
	public String createEvento() {
		evento = new Evento();
		evento.setId(new Long(0L));
		//evento.setValor("");
		//evento.setActivo("N");
		this.solicitudDestinoRedirectPage = AppConstants.EVENTO_SEARCH_VIEW;
		return AppConstants.EVENTO_CREATE_VIEW;
	}

	/**
	 * 
	 * @return
	 */
	public String updateEvento() {
		Map params = getExternalContext().getRequestParameterMap();
		String eventoDataIndex = (String) params
				.get("eventoDataIndex");
		this.evento = (Evento) ((List) this.eventoListModel
				.getWrappedData())
				.get(Integer.parseInt(eventoDataIndex));
		checkAddress();
		this.solicitudDestinoRedirectPage = AppConstants.EVENTO_SEARCH_VIEW;
		return AppConstants.EVENTO_UPDATE_VIEW;
	}

	/**
	 * 
	 * @return
	 */
	public String cancelEvento() {
		return AppConstants.EVENTO_SEARCH_VIEW;
	}
	/**
	 * 
	 * @return
	 */
	public String cancelEventoOpcion() {
		return AppConstants.EVENTO_MENU_VIEW;
	}

	/**
	 * limpia el contenido de los valores que se ingresan para buscar
	 */
	public final void cleanSearchValues() {
		eventoSearch.setEstado("");
	}

	/**
	 * limpia el contenido de los valores que se ingresan (Create, Update)
	 */
	public final void cleanValues() {
		evento.setId(new Long(0L));
		evento.setEstado("");
		this.eventoListModel = new ListDataModel();
	}

	// --------------------------------------------------------------------
	// --- metodos para atender reglas de navegacion end()
	// --------------------------------------------------------------------

	// --------------------------------------------------------------------
	// --- getters and setters init()
	// --------------------------------------------------------------------

	/**
	 * 
	 */
	public Evento getEventoSearch() {
		return eventoSearch;
	}

	/**
	 * 
	 * @param eventoSearch
	 */
	public void seteventoSearch(Evento eventoSearch) {
		this.eventoSearch = eventoSearch;
	}

	/**
	 * 
	 * @return
	 */
	public DataModel geteventoListModel() {
		return eventoListModel;
	}

	/**
	 * 
	 * @param eventoListModel
	 */
	public void seteventoListModel(DataModel eventoListModel) {
		this.eventoListModel = eventoListModel;
	}

	/**
	 * 
	 * @return
	 */
	public Evento getEvento() {
		return evento;
	}

	/**
	 * 
	 * @param evento
	 */
	public void setevento(Evento evento) {
		this.evento = evento;
	}

	/**
	 * obtencion del servicio eventoService
	 * 
	 * @return
	 */
	public IEventoService getEventoService() {
		return eventoService;
	}

	/**
	 * establecimiento del servicio eventoService, la inyeccion de la
	 * dependencia la cubre SpringFramework
	 * 
	 * @param eventoService
	 */
	public void setEventoService(
			IEventoService eventoService) {
		this.eventoService = eventoService;
	}
	

	public GeoUbicacionClient getGeoUbicacionClient() {
		return geoUbicacionClient;
	}

	public void setGeoUbicacionClient(GeoUbicacionClient geoUbicacionClient) {
		this.geoUbicacionClient = geoUbicacionClient;
	}

	public EventoVistoBuenoController getEventoVistoBuenoController() {
		return eventoVistoBuenoController;
	}

	public void setEventoVistoBuenoController(
			EventoVistoBuenoController eventoVistoBuenoController) {
		this.eventoVistoBuenoController = eventoVistoBuenoController;
	}

	public ConceptoInicialController getConceptoInicialController() {
		return conceptoInicialController;
	}

	public void setConceptoInicialController(
			ConceptoInicialController conceptoInicialController) {
		this.conceptoInicialController = conceptoInicialController;
	}

	public IEventoVistoBuenoService getEventoVistoBuenoService() {
		return eventoVistoBuenoService;
	}

	public void setEventoVistoBuenoService(
			IEventoVistoBuenoService eventoVistoBuenoService) {
		this.eventoVistoBuenoService = eventoVistoBuenoService;
	}
	
	// --------------------------------------------------------------------
	// --- getters and setters end()
	// --------------------------------------------------------------------

}
